/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.jini; import java.awt.datatransfer.StringSelection; import java.beans.*; import java.lang.reflect.*; import java.util.*; import java.text.MessageFormat; import org.openide.nodes.Node; import org.openide.util.actions.CookieAction; import org.openide.util.HelpCtx; import org.openide.TopManager; import net.jini.core.lookup.*; import net.jini.core.entry.Entry; /** * */ public class ServiceTemplateAction extends CookieAction { /** * @associates String */ ArrayList locators, entryClasses, serviceTypes, groups, services, serviceEntries, entryVars; static int entryNum, phaseNum; static String indent = " "; StringBuffer code = new StringBuffer(4096); MessageFormat decl = new MessageFormat("{0} {1} = new {0} ({2});\n"); MessageFormat declArray = new MessageFormat("{0}[] {1} = new {0}[] '{'{2}'}';\n"); MessageFormat declNull = new MessageFormat("{0} {1} = null;\n"); String varName, sIDvarName, stvarName, evarName; protected void performAction(Node[] activatedNodes) { code.delete(0, code.length()); entryClasses = new ArrayList(10); serviceTypes = new ArrayList(10); services = new ArrayList(10); serviceEntries = new ArrayList(10); entryVars = new ArrayList(10); Iterator it; for(int i = 0; i < activatedNodes.length; i++) { ServiceTemplateCookie stc = (ServiceTemplateCookie)activatedNodes[i].getCookie(ServiceTemplateCookie.class); // Ugly, isn't it? switch (stc.getType()) { // case LOOKUP_LOCATOR: case ServiceTemplateCookie.ENTRY_CLASSES: { Class[] classes = (Class[])stc.getSource(); for(int j = 0; j < classes.length; j++) entryClasses.add(classes[j]); }; break; case ServiceTemplateCookie.ENTRY_CLASS_ITEM: { Class clazz = (Class)stc.getSource(); entryClasses.add(clazz); }; break; case ServiceTemplateCookie.ENTRY_OBJECT_ITEM: { serviceEntries.add(stc.getSource()); }; break; case ServiceTemplateCookie.SERVICE_TYPES: { Class[] classes = (Class[])stc.getSource(); for(int j = 0; j < classes.length; j++) serviceTypes.add(classes[j]); }; break; case ServiceTemplateCookie.SERVICE_TYPE_ITEM: { Class clazz = (Class)stc.getSource(); serviceTypes.add(clazz); }; break; case ServiceTemplateCookie.SERVICES: { ServiceMatches sm = (ServiceMatches)stc.getSource(); for(int j = 0; j < sm.totalMatches; j++) services.add(sm.items[j]); }; break; case ServiceTemplateCookie.SERVICE_ITEM: services.add(stc.getSource()); } } // service ID sIDvarName = varName = "serviceID" + phaseNum; if (services.size() > 0) { ServiceItem si = (ServiceItem) services.get(0); String param = "0x" + Long.toHexString(si.serviceID.getMostSignificantBits()) + "L, 0x" + Long.toHexString(si.serviceID.getLeastSignificantBits()) + "L"; Object obj[] = new Object[] { ServiceID.class.getName(), varName, param }; code.append(decl.format(obj)); } else { code.append(declNull.format(new Object[] { ServiceID.class.getName(), varName })); } // service ID code.append('\n'); // service types stvarName = varName = "serviceTypes" + phaseNum; if (serviceTypes.size() > 0) { StringBuffer stParams = new StringBuffer(1024); stParams.append('\n'); it = serviceTypes.iterator(); while (it.hasNext()) { Class cl = (Class) it.next(); stParams.append(indent); stParams.append(cl.getName()); stParams.append(".class"); if (it.hasNext()) stParams.append(","); stParams.append('\n'); } code.append(declArray.format(new Object[] { Class.class.getName(), varName, stParams, })); } else { code.append(declNull.format(new Object[] { Class.class.getName() + "[]", varName })); } //service types code.append('\n'); // entries it = serviceEntries.iterator(); while (it.hasNext()) { Entry entry = (Entry) it.next(); String className = entry.getClass().getName(); varName = createEntryVar(extractClassName(className), entryNum++ ); entryVars.add(varName); removeFromList(entryClasses, entry.getClass()); code.append(decl.format(new Object[] { className, varName, "" })); code.append(fillEntry(varName, entry.getClass(), entry)); code.append('\n'); } it = entryClasses.iterator(); while (it.hasNext()) { Class eclass = (Class) it.next(); String className = eclass.getName(); varName = createEntryVar(extractClassName(className), entryNum++ ); entryVars.add(varName); code.append(decl.format(new Object[] { className, varName, "" })); code.append(fillEntry(varName, eclass, null)); code.append('\n'); } // entries // evarName = varName = "entries" + phaseNum; if (entryVars.size() > 0) { StringBuffer stParams = new StringBuffer(1024); stParams.append('\n'); it = entryVars.iterator(); while (it.hasNext()) { String entryName = (String) it.next(); stParams.append(indent); stParams.append(entryName); if (it.hasNext()) stParams.append(","); stParams.append('\n'); } code.append(declArray.format(new Object[] { Entry.class.getName(), varName, stParams, })); } else { code.append(declNull.format(new Object[] { Entry.class.getName() + "[]", varName })); } // code.append('\n'); code.append(decl.format(new Object[] { ServiceTemplate.class.getName(), "serviceTemplate" + phaseNum, sIDvarName + ", " + stvarName + ", " + evarName, })); code.append('\n'); // System.out.println(code.toString()); TopManager.getDefault().getClipboard().setContents(new StringSelection(code.toString()), null); } // public static boolean isWrapper(Class clazz) { String name = clazz.getName(); if (name.equals("java.lang.Boolean") || name.equals("java.lang.Byte") || name.equals("java.lang.Character") || name.equals("java.lang.Double") || name.equals("java.lang.Float") || name.equals("java.lang.Integer") || name.equals("java.lang.Long") || name.equals("java.lang.Short") || name.equals("java.lang.String")) return true; return false; } public String fillEntry(String varName, Class clazz, Object obj) { StringBuffer entrycode = new StringBuffer(128); MessageFormat var = new MessageFormat("{0}.{1} = {2};\n"); Object data[] = new Object[3]; data[0] = varName; Field[] fields = clazz.getFields(); for(int i = 0; i < fields.length; i++) { if (!valid(fields[i])) continue; data[1] = fields[i].getName(); data[2] = "null"; if (obj != null) { try { data[2] = valueToString(fields[i], obj); } catch (Exception ex) { } } entrycode.append(var.format(data)); } return entrycode.toString(); } public static String valueToString(Field f, Object obj) throws Exception { Class clazz = f.getType(); String name = clazz.getName(); if (isWrapper(clazz)) { Object val = f.get(obj); if (val == null) return "null"; String value = val.toString(); if (name.equals("java.lang.String")) return "\"" + value + "\""; if (name.equals("java.lang.Character")) return "new java.lang.Character('" + value + "')"; if (name.equals("java.lang.Byte")) return "new java.lang.Byte((byte)" + value + ")"; if (name.equals("java.lang.Short")) return "new java.lang.Short((short)" + value + ")"; if (name.equals("java.lang.Float")) return "new java.lang.Float(" + value + "F)"; if (name.equals("java.lang.Long")) return "new java.lang.Long(" + value + "L)"; return "new " + name + "(" + value + ")"; } PropertyEditor pe = PropertyEditorManager.findEditor(f.getType()); if (pe != null) { pe.setValue(f.get(obj)); String initS = pe.getJavaInitializationString(); if (initS != null) { return initS; } } return "null"; } public static boolean valid(Field f) { return (f.getModifiers() & (Modifier.STATIC|Modifier.FINAL)) == 0; } public String createEntryVar(String classname, int number) { StringBuffer sb = new StringBuffer(64); sb.append(classname); sb.append(number); sb.setCharAt(0, Character.toLowerCase(sb.charAt(0))); return sb.toString(); } public static String extractClassName(String name) { int i = name.lastIndexOf('.'); return name.substring(i + 1); } public static void removeFromList(List list, Object key) { Iterator it = list.iterator(); while (it.hasNext()) { if (key.equals(it.next())) it.remove(); } } // /* protected boolean enable(Node[] activatedNodes) { return true; } */ protected Class[] cookieClasses() { return new Class[] { ServiceTemplateCookie.class }; } protected int mode() { return MODE_ALL; } public String getName() { return Util.getString("PROP_Service_Template_Action_Name"); } public HelpCtx getHelpCtx() { return new HelpCtx(ServiceTemplateAction.class); } protected HashSet parseEntry(Entry entry) { HashSet hs = new HashSet(); return hs; } } /* * <<Log>> * 3 Gandalf 1.2 2/2/00 Petr Kuzel Jini module upon 1.1alpha * 2 Gandalf 1.1 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 1 Gandalf 1.0 6/11/99 Martin Ryzl * $ */